
#include <iostream>
#include <cstdio>
#include "thread.h"

using namespace zmh;

int ticket = 1000;

pthread_mutex_t gmutex = PTHREAD_MUTEX_INITIALIZER;
// pthread_cond_t gmutex = PTHREAD_COND_INITIALIZER;


void BuyTickets(pthread_mutex_t* mutex)
{
    while (1)
    {
        pthread_mutex_lock(mutex);
        if (ticket > 0)
        {
            usleep(1000); // 进来之后,先让其休眠,不让线程在切换之前执行完代码
            ticket--;
            printf("线程%ld,抢票成功,剩余票数%d...\n", pthread_self(), ticket);
            pthread_mutex_unlock(mutex);
            usleep(1000); // 进来之后,先让其休眠,不让线程在切换之前执行完代码
        }
        else
        {
            pthread_mutex_unlock(mutex);
            break;
        }
    }
}

int main()
{
    pthread_mutex_t mutex;
    pthread_mutex_init(&mutex,nullptr);

    thread t1(BuyTickets,&mutex); // 线程1
    thread t2(BuyTickets,&mutex); // 线程2
    thread t3(BuyTickets,&mutex); // 线程3
    thread t4(BuyTickets,&mutex); // 线程4

    t1.join();
    t2.join();
    t3.join();
    t4.join();

    pthread_mutex_destroy(&mutex);
    return 0;
}

// void *RounTine(void *argc)
// {
//     // 知识点1 --- 线程被主动取消后，需要等待
//     int cnt = 5;
//     while (cnt--)
//     {
//         sleep(1);
//         printf("线程%ld说: ZMH love WK\n", pthread_self());
//     }
//     return (void *)(0);
// }

// void func1()
// {
//     int cnt = 10;
//     while (--cnt)
//     {
//         sleep(1);
//         cout << "2025年3月27日---我在学校做牛马" << endl;
//     }
// }
// int main()
// {
//     zmh::thread t(func1);
//     sleep(10);
//     return 0;
// }
